#ifndef __HARD_SPI_H
#define __HARD_SPI_H

#include <stdint.h>

typedef enum {
	HARD_SPI_CH0,
} HardSPICHEnum;

typedef struct {
	uint32_t dataSize;
	uint32_t speed;
} HardSPIInitTypeDef;

void HardSPIDeInit(HardSPICHEnum spich);
void HardSPISetSpeed(HardSPICHEnum spich, uint32_t speed);

void HardSPISendOneByte(HardSPICHEnum spich, uint8_t data);
void HardSPISendOneHalfWord(HardSPICHEnum spich, uint16_t data);
void HardSPISendOneWord(HardSPICHEnum spich, uint32_t data);

void HardSPISendByteArray(HardSPICHEnum spich, uint8_t *array, uint32_t len);
void HardSPISendHalfWordArray(HardSPICHEnum spich, uint16_t *array, uint32_t len);
void HardSPISendWordArray(HardSPICHEnum spich, uint32_t *array, uint32_t len);

uint8_t HardSPISendReceiveOneByte(HardSPICHEnum spich, uint8_t data);
uint16_t HardSPISendReceiveOneHalfWord(HardSPICHEnum spich, uint16_t data);
uint32_t HardSPISendReceiveOneWord(HardSPICHEnum spich, uint32_t data);

void HardSPISendReceiveByteArray(HardSPICHEnum spich, uint8_t *txArray, uint32_t len, uint8_t *rxArray);
void HardSPISendReceiveHalfWordArray(HardSPICHEnum spich, uint16_t *txArray, uint32_t len, uint16_t *rxArray);
void HardSPISendReceiveWordArray(HardSPICHEnum spich, uint32_t *txArray, uint32_t len, uint32_t *rxArray);

void HardSPISendByteArrayPDMA(HardSPICHEnum spich, uint32_t srcAddr, uint32_t txSize);
void HardSPISendHalfWordArrayPDMA(HardSPICHEnum spich, uint32_t srcAddr, uint32_t txSize);
void HardSPISendWordArrayPDMA(HardSPICHEnum spich, uint32_t srcAddr, uint32_t txSize);

void HardSPISendReceiveByteArrayPDMA(HardSPICHEnum spich, uint32_t txSrcAddr, uint32_t txSize, uint32_t rxSrcAddr, uint32_t rxSize);
void HardSPISendReceiveHalfWordArrayPDMA(HardSPICHEnum spich, uint32_t txSrcAddr, uint32_t txSize, uint32_t rxSrcAddr, uint32_t rxSize);
void HardSPISendReceiveWordArrayPDMA(HardSPICHEnum spich, uint32_t txSrcAddr, uint32_t txSize, uint32_t rxSrcAddr, uint32_t rxSize);

#endif
